package com.base.string;

import java.util.HashSet;
import java.util.Set;

/**
 * 859. 亲密字符串
 *给你两个字符串 s 和 goal ，只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果，就返回 true ；否则返回 false 。
 *
 * 交换字母的定义是：取两个下标 i 和 j （下标从 0 开始）且满足 i != j ，接着交换 s[i] 和 s[j] 处的字符。
 *
 * 例如，在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/buddy-strings
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author leon
 * @date 2021年11月23日 17:35
 */
public class BuddyStrings {
    /**
     * 需要考虑三种情况：
     * 1、长度是否一致，不一致返回false
     * 2、s与goal字符串相等时，需要考虑是否有相等字符，
     * 3、字符串长度一致，大小并不相等时，判断是否只有两个不相等字符
     * @param s
     * @param goal
     * @return
     */
    public boolean buddyStrings(String s, String goal) {
        int m = s.length();
        int n = goal.length();
        if(m!=n){
            return false;
        }
        if(s.equals(goal)){
            if (isEqualChar(s.toCharArray())){
                return true;
            }else {
                return false;
            }
        }

        char[][] change = new char[2][2];
        int j = 0;
        for(int i = 0;i<m;i++){
            if(s.charAt(i)!=goal.charAt(i)){
                if(j<2){
                    change[0][j] = s.charAt(i);
                    change[1][j] = goal.charAt(i);
                    j++;
                }else{
                    return false;
                }

            }
        }

        if(change[0][0]==change[1][1]&&change[0][1]==change[1][0]){
            return true;
        }
        return false;

    }

    public boolean isEqualChar(char[] s){
        Set<Character> set = new HashSet<>();
        for(char a:s){
            if(set.contains(a)){
                return true;
            }
            set.add(a);
        }
        return false;
    }
}
